Analysis of the presidential election

Author: Bartosz Dzionek (Github)

We will use the following libraries through this analysis:

In [1]:
import pandas as pd
import json
import numpy as np
import plotly.express as px
from IPython.display import display, Markdown
import scipy.stats as sp

Introduction

In this Data Science paper I analyze the results of the presidential elections in Poland in 2020. The results are taken from the website of the National Electoral Commission (Polish: Państwowa Komisja Wyborcza) – link.

In this election the voters were eligible to vote for the following candidates:

In [2]:
candidates_df = pd.read_csv('data/candidates/candidates.csv', sep=';')
candidates_df.set_index('Pozycja na karcie', inplace=True)
In [3]:
candidates_df
Out[3]:
Nazwisko Imiona Płeć Wiek Wykształcenie Zawód Miejsce pracy Miejsce zamieszkania Przynależność do partii Nazwa komitetu Sygnatura TERYT m. z. Gmina m.z.
Pozycja na karcie
1 BIEDROŃ Robert Mężczyzna 44 wyższe politologiczne poseł do Parlamentu Europejskiego NaN Warszawa członek partii politycznej: Wiosna Roberta Bie... KOMITET WYBORCZY KANDYDATA NA PREZYDENTA RZECZ... ZPOW-6020-6/20 146506 Ochota
2 BOSAK Krzysztof Mężczyzna 38 średnie poseł na Sejm Rzeczypospolitej Polskiej NaN Warszawa członek partii politycznej: Konfederacja Wolno... KOMITET WYBORCZY KANDYDATA NA PREZYDENTA RZECZ... ZPOW-6020-1/20 146518 Wola
3 DUDA Andrzej Sebastian Mężczyzna 48 wyższe prawnicze Prezydent Rzeczypospolitej Polskiej NaN Kraków nie należy do partii politycznej KOMITET WYBORCZY KANDYDATA NA PREZYDENTA RZECZ... ZPOW-6020-5/20 126101 m. Kraków
4 HOŁOWNIA Szymon Franciszek Mężczyzna 43 średnie publicysta własna działalność gospodarcza Otwock nie należy do partii politycznej KOMITET WYBORCZY KANDYDATA NA PREZYDENTA RZECZ... ZPOW-6020-4/20 141702 m. Otwock
5 JAKUBIAK Marek Mężczyzna 61 średnie menadżer Browary Regionalne Jakubiak Sp. z o.o. Warszawa członek partii politycznej: Federacja dla Rzec... KOMITET WYBORCZY KANDYDATA NA PREZYDENTA RZECZ... ZPOW-6020-28/20 146510 Śródmieście
6 KOSINIAK-KAMYSZ Władysław Marcin Mężczyzna 38 wyższe medyczne poseł na Sejm Rzeczypospolitej Polskiej NaN Kraków członek partii politycznej: Polskie Stronnictw... KOMITET WYBORCZY KANDYDATA NA PREZYDENTA RZECZ... ZPOW-6020-2/20 126101 m. Kraków
7 PIOTROWSKI Mirosław Mariusz Mężczyzna 54 wyższe historyczne nauczyciel akademicki Wyższa Szkoła Kultury Społecznej i Medialnej Lublin członek partii politycznej: Ruch Prawdziwa Eur... KOMITET WYBORCZY KANDYDATA NA PREZYDENTA RZECZ... ZPOW-6020-9/20 66301 m. Lublin
8 TANAJNO Paweł Jan Mężczyzna 44 wyższe w zakresie zarządzania przedsiębiorca IAM4U.pl Sp. z o.o. Warszawa nie należy do partii politycznej KOMITET WYBORCZY KANDYDATA NA PREZYDENTA RZECZ... ZPOW-6020-13/20 146518 Wola
9 TRZASKOWSKI Rafał Kazimierz Mężczyzna 48 wyższe politologiczne pracownik samorządowy Urząd m.st. Warszawy Warszawa członek partii politycznej: Platforma Obywatel... KOMITET WYBORCZY KANDYDATA NA PREZYDENTA RZECZ... ZPOW-6020-41/20 146510 Śródmieście
10 WITKOWSKI Waldemar Włodzimierz Mężczyzna 66 wyższe zarządca Spółdzielnia Mieszkaniowa im. Hipolita Cegiels... Poznań członek partii politycznej: Unia Pracy KOMITET WYBORCZY KANDYDATA NA PREZYDENTA RZECZ... ZPOW-6020-20/20 306401 m. Poznań
11 ŻÓŁTEK Stanisław Józef Mężczyzna 64 średnie NaN własna działalność Kraków członek partii politycznej: Kongres Nowej Prawicy KOMITET WYBORCZY KANDYDATA NA PREZYDENTA RZECZ... ZPOW-6020-10/20 126101 m. Kraków

We generate a list of these candidates to filer their results later on.

In [4]:
candidates_first_name = candidates_df['Imiona'].tolist()
candidates_last_name = candidates_df['Nazwisko'].tolist()

candidates = np.array(
    list(zip(candidates_first_name, candidates_last_name))
)

candidates = [candidate[0] + ' ' + candidate[1] for candidate in candidates]
In [5]:
candidates
Out[5]:
['Robert BIEDROŃ',
 'Krzysztof BOSAK',
 'Andrzej Sebastian DUDA',
 'Szymon Franciszek HOŁOWNIA',
 'Marek JAKUBIAK',
 'Władysław Marcin KOSINIAK-KAMYSZ',
 'Mirosław Mariusz PIOTROWSKI',
 'Paweł Jan TANAJNO',
 'Rafał Kazimierz TRZASKOWSKI',
 'Waldemar Włodzimierz WITKOWSKI',
 'Stanisław Józef ŻÓŁTEK']

Since this full name format is not very good to display in charts, we create a function to display only the last name in Title Case format.

In [6]:
def get_last_name(full_name):
    """Get the last name from full name."""
    return full_name.split(' ')[-1].title()
In [7]:
get_last_name('Władysław Marcin KOSINIAK-KAMYSZ')
Out[7]:
'Kosiniak-Kamysz'

To differentiate maps of the candidates, we will use colors associated with their campaign.

In [8]:
candidates_colors = {
    'Robert BIEDROŃ' : px.colors.sequential.Reds,
    'Krzysztof BOSAK' : px.colors.sequential.Greys,
    'Andrzej Sebastian DUDA' : px.colors.sequential.Blues,
    'Szymon Franciszek HOŁOWNIA' : px.colors.sequential.YlOrBr,
    'Marek JAKUBIAK' : px.colors.sequential.Purples,
    'Władysław Marcin KOSINIAK-KAMYSZ' : px.colors.sequential.Greens,
    'Mirosław Mariusz PIOTROWSKI' : px.colors.sequential.matter,
    'Paweł Jan TANAJNO' : px.colors.sequential.PuBu,
    'Rafał Kazimierz TRZASKOWSKI' : px.colors.sequential.Oranges,
    'Waldemar Włodzimierz WITKOWSKI' : px.colors.sequential.YlOrRd,
    'Stanisław Józef ŻÓŁTEK' : px.colors.sequential.tempo
}

Results

Total results

Firstly, we find how many voters have voted for each candidate.

In [9]:
results_counties_df = pd.read_csv('data/results/results_by_county.csv', sep=';')

total_results_df = (
    results_counties_df[candidates].sum().to_frame('Result')
                                   .sort_values('Result', ascending=False)
                                   .reset_index()
)

total_results_df.columns = ['Candidate', 'Result']

total_results_df['Candidate'] = total_results_df['Candidate'].apply(get_last_name)
In [10]:
total_results_df
Out[10]:
Candidate Result
0 Duda 8450513
1 Trzaskowski 5917340
2 Hołownia 2693397
3 Bosak 1317380
4 Kosiniak-Kamysz 459365
5 Biedroń 432129
6 Żółtek 45419
7 Jakubiak 33652
8 Tanajno 27909
9 Witkowski 27290
10 Piotrowski 21065

We then display this results as a bar chart.

In [11]:
total_results_fig = px.bar(total_results_df, x='Candidate', y='Result', title='Total number of votes', text='Result')
total_results_fig.update_traces(texttemplate='%{text:.2s}', textposition='outside')
total_results_fig.update_layout(uniformtext_minsize=8, uniformtext_mode='hide')
total_results_fig.show()

But we also want to see the results in percents. We find the total number of votes to get that information.

In [12]:
total_num_of_votes = total_results_df['Result'].sum()
total_num_of_votes
Out[12]:
19425459
In [13]:
def find_percent(n):
    """Find the percent of n with regards to the total number of votes."""
    return round(n / total_num_of_votes * 100, 2)
In [14]:
total_results_percent_df = pd.concat([total_results_df['Candidate'], total_results_df['Result'].map(find_percent)], axis=1)
total_results_percent_df
Out[14]:
Candidate Result
0 Duda 43.50
1 Trzaskowski 30.46
2 Hołownia 13.87
3 Bosak 6.78
4 Kosiniak-Kamysz 2.36
5 Biedroń 2.22
6 Żółtek 0.23
7 Jakubiak 0.17
8 Tanajno 0.14
9 Witkowski 0.14
10 Piotrowski 0.11
In [15]:
total_results_percent_fig = px.bar(
    total_results_percent_df, x='Candidate', y='Result', title='Total number of votes (in %)', text='Result'
)

total_results_percent_fig.update_traces(texttemplate='%{text}%', textposition='outside')
total_results_percent_fig.update_layout(uniformtext_minsize=8, uniformtext_mode='hide')
total_results_percent_fig.show()

Results by county

Now, we compare results of each candidate (given in %) with regard to county.

In [16]:
results_counties_percent_df = pd.read_csv('data/results/results_by_county_percent.csv', sep=';')
results_counties_percent_df = results_counties_percent_df[['Kod TERYT', 'Powiat'] + candidates]
for candidate in candidates:
    results_counties_percent_df[candidate] = results_counties_percent_df[candidate].apply(lambda x: float(x.replace(',', '.')))
In [17]:
results_counties_percent_df.head()
Out[17]:
Kod TERYT Powiat Robert BIEDROŃ Krzysztof BOSAK Andrzej Sebastian DUDA Szymon Franciszek HOŁOWNIA Marek JAKUBIAK Władysław Marcin KOSINIAK-KAMYSZ Mirosław Mariusz PIOTROWSKI Paweł Jan TANAJNO Rafał Kazimierz TRZASKOWSKI Waldemar Włodzimierz WITKOWSKI Stanisław Józef ŻÓŁTEK
0 20100 bolesławiecki 2.08 6.72 41.56 16.39 0.13 1.54 0.07 0.12 31.03 0.13 0.24
1 20200 dzierżoniowski 2.16 6.09 44.03 13.67 0.12 1.48 0.10 0.18 31.87 0.10 0.19
2 20300 głogowski 2.33 5.95 44.19 14.21 0.10 1.75 0.10 0.14 30.94 0.10 0.20
3 20400 górowski 2.00 6.20 50.04 13.14 0.14 2.59 0.08 0.10 25.49 0.07 0.15
4 20500 jaworski 2.05 6.55 47.78 11.18 0.12 3.08 0.12 0.09 28.77 0.06 0.19

Simultaneusly, we import the geographical data about borders of each county from the official data of the Head Office of Geodesy and Cartography. The webiste of GIS Support PL let us solely download the package with counties. To create maps I will use GeoJSON format. The data from the websites mentioned before has the .shp extension, so I have formatted it to GeoJSON using MapShaper.

In [18]:
with open('data/geojson/counties.json', encoding='utf-8') as response:
    counties = json.load(response)
In [19]:
counties['features'][0]['properties']
Out[19]:
{'JPT_SJR_KO': 'POW',
 'JPT_KOD_JE': '1815',
 'JPT_NAZWA_': 'powiat ropczycko-sędziszowski',
 'JPT_ORGAN_': '',
 'JPT_JOR_ID': 13415,
 'WERSJA_OD': '2012-09-26T00:00:00.000Z',
 'WERSJA_DO': '1899-11-30T00:00:00.000Z',
 'WAZNY_OD': '2012-09-26T00:00:00.000Z',
 'WAZNY_DO': '1899-11-30T00:00:00.000Z',
 'JPT_KOD__1': '',
 'JPT_NAZWA1': '',
 'JPT_ORGAN1': 'NZN',
 'JPT_WAZNA_': 'NZN',
 'ID_BUFORA_': 13878,
 'ID_BUFORA1': 0,
 'ID_TECHNIC': 829084,
 'IIP_PRZEST': 'PL.PZGIK.200',
 'IIP_IDENTY': 'e86b1e71-8958-42ee-bec5-ca3c87907bc8',
 'IIP_WERSJA': '2012-09-27T08:01:01+02:00',
 'JPT_KJ_IIP': 'EGIB',
 'JPT_KJ_I_1': '1815',
 'JPT_KJ_I_2': '',
 'JPT_OPIS': '',
 'JPT_SPS_KO': 'UZG',
 'ID_BUFOR_1': 0,
 'JPT_ID': 829084,
 'JPT_KJ_I_3': '',
 'Shape_Leng': 1.77616265095,
 'Shape_Area': 0.0688251674637}

The TERYT code is a unique code of each administrative unit. In the elections result the code has two extra 00. Additionally, it doesn't have a leading zero when its voivodeship number is only on digit. We are going to fix this issues to connect these two datasets.

In [20]:
def fix_teryt(teryt):
    """Fix TERYT code to integrate the two datasets."""
    teryt = str(teryt)
    
    if len(teryt) == 5:
        teryt = '0' + teryt
    
    return teryt[:-2]
In [21]:
results_counties_percent_df['Kod TERYT'] = results_counties_percent_df['Kod TERYT'].astype(str).map(fix_teryt)
In [22]:
results_counties_percent_df.head()
Out[22]:
Kod TERYT Powiat Robert BIEDROŃ Krzysztof BOSAK Andrzej Sebastian DUDA Szymon Franciszek HOŁOWNIA Marek JAKUBIAK Władysław Marcin KOSINIAK-KAMYSZ Mirosław Mariusz PIOTROWSKI Paweł Jan TANAJNO Rafał Kazimierz TRZASKOWSKI Waldemar Włodzimierz WITKOWSKI Stanisław Józef ŻÓŁTEK
0 0201 bolesławiecki 2.08 6.72 41.56 16.39 0.13 1.54 0.07 0.12 31.03 0.13 0.24
1 0202 dzierżoniowski 2.16 6.09 44.03 13.67 0.12 1.48 0.10 0.18 31.87 0.10 0.19
2 0203 głogowski 2.33 5.95 44.19 14.21 0.10 1.75 0.10 0.14 30.94 0.10 0.20
3 0204 górowski 2.00 6.20 50.04 13.14 0.14 2.59 0.08 0.10 25.49 0.07 0.15
4 0205 jaworski 2.05 6.55 47.78 11.18 0.12 3.08 0.12 0.09 28.77 0.06 0.19

This is the location of the key that will join our data sets in counties JSON:

In [23]:
counties['features'][0]['properties']['JPT_KOD_JE']
Out[23]:
'1815'
In [24]:
def get_figure_results_by_county(candidate):
    """Get figure showing a map of results of the given cadidate by county."""
    candidate_df = results_counties_percent_df[['Kod TERYT', 'Powiat', candidate]]
    
    # We remove the results from ships and abroad because they will not be shown on the map
    candidate_df = candidate_df[candidate_df.Powiat != 'statki']
    candidate_df = candidate_df[candidate_df.Powiat != 'zagranica']
    
    fig = px.choropleth_mapbox(
        candidate_df, geojson=counties, color=candidate,
        locations='Kod TERYT', featureidkey="properties.JPT_KOD_JE",
        center={"lat": 52, "lon": 19.1451},
        opacity=0.8, color_continuous_scale=candidates_colors[candidate],
        hover_data={'Powiat': True, 'Kod TERYT': False},
        mapbox_style="carto-positron", zoom=5.2
    )
    
    fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
    
    return fig
In [25]:
for candidate in candidates:
    display(Markdown(f'### Results of {candidate} by county'))
    get_figure_results_by_county(candidate).show()

Results of Robert BIEDROŃ by county

Results of Krzysztof BOSAK by county

Results of Andrzej Sebastian DUDA by county

Results of Szymon Franciszek HOŁOWNIA by county

Results of Marek JAKUBIAK by county

Results of Władysław Marcin KOSINIAK-KAMYSZ by county

Results of Mirosław Mariusz PIOTROWSKI by county

Results of Paweł Jan TANAJNO by county

Results of Rafał Kazimierz TRZASKOWSKI by county

Results of Waldemar Włodzimierz WITKOWSKI by county

Results of Stanisław Józef ŻÓŁTEK by county

Disproportions between results

Analyzing these maps, one can see that for some candidates the electorate is spread similarly around the whole country. Meanwhile, the others have much greater support in some regions. Who is the candidate with the most equally spread electorate?

In [37]:
coefficient_of_variation_df = pd.DataFrame(
    results_counties_percent_df[candidates].apply(sp.variation)
).sort_values(by=0).transpose()

coefficient_of_variation_df
Out[37]:
Krzysztof BOSAK Stanisław Józef ŻÓŁTEK Andrzej Sebastian DUDA Szymon Franciszek HOŁOWNIA Paweł Jan TANAJNO Robert BIEDROŃ Władysław Marcin KOSINIAK-KAMYSZ Rafał Kazimierz TRZASKOWSKI Mirosław Mariusz PIOTROWSKI Waldemar Włodzimierz WITKOWSKI Marek JAKUBIAK
0 0.197774 0.214243 0.244968 0.256535 0.26028 0.310794 0.321589 0.346106 0.372991 0.378609 0.496703

As we see, Krzysztof Bosak is the most equally supported candidate in Poland. He is follwed by Stanisław Żółek and Andrzej Duda. Rafał Trzaskowski is the 8th in this comparison. Marek Jakubiak is at the end of the list.

How many voters will not have their candidate of the first choice in the second round?

The crucial challange Andrzej Duda and Rafał Trzaskowski will need to face in the second round is to convince the voters who did not vote them in the first round. What counties have the most voters to convince? In other words, what counties should the two candidates focus on the most in the campaign?

We first find the number of voters of the other candidates in each county.

In [67]:
candidates_2nd_round = ['Andrzej Sebastian DUDA', 'Rafał Kazimierz TRZASKOWSKI']

candidates_no_2nd_round = [
    candidate 
    for candidate in candidates
    if candidate not in candidates_2nd_round
]

candidates_no_2nd_round_df = pd.DataFrame(results_counties_df[candidates_no_2nd_round].sum(axis=1))
candidates_no_2nd_round_df.columns = ['Other electorate']

results_potential_2nd_round_df = pd.concat(
    [results_counties_df[['Powiat', 'Kod TERYT']], candidates_no_2nd_round_df], axis=1
)

results_potential_2nd_round_df['Kod TERYT'] = results_potential_2nd_round_df['Kod TERYT'].astype(str).map(fix_teryt)

results_potential_2nd_round_df.head()
Out[67]:
Powiat Kod TERYT Other electorate
0 bolesławiecki 0201 11250
1 dzierżoniowski 0202 11167
2 głogowski 0203 10451
3 górowski 0204 3573
4 jaworski 0205 5467

We plot it.

In [71]:
# We remove the results from ships and abroad because they will not be shown on the map
results_potential_2nd_round_df = results_potential_2nd_round_df[results_potential_2nd_round_df.Powiat != 'statki']
results_potential_2nd_round_df = results_potential_2nd_round_df[results_potential_2nd_round_df.Powiat != 'zagranica']

results_potential_2nd_round_fig = px.choropleth_mapbox(
    results_potential_2nd_round_df, geojson=counties, color='Other electorate',
    locations='Kod TERYT', featureidkey="properties.JPT_KOD_JE",
    center={"lat": 52, "lon": 19.1451},
    opacity=0.8, color_continuous_scale=px.colors.sequential.Reds,
    hover_data={'Powiat': True, 'Kod TERYT': False},
    mapbox_style="carto-positron", zoom=5.2
)

results_potential_2nd_round_fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
results_potential_2nd_round_fig.show()

They are mainly in big cities. It might be better to see how this looks in relative electorate.

In [73]:
candidates_no_2nd_round_percent_df = pd.DataFrame(results_counties_percent_df[candidates_no_2nd_round].sum(axis=1))
candidates_no_2nd_round_percent_df.columns = ['Other electorate [%]']

results_potential_2nd_round_percent_df = pd.concat(
    [results_counties_df[['Powiat', 'Kod TERYT']], candidates_no_2nd_round_percent_df], axis=1
)

results_potential_2nd_round_percent_df['Kod TERYT'] = \
    results_potential_2nd_round_percent_df['Kod TERYT'].astype(str).map(fix_teryt)

# We remove the results from ships and abroad because they will not be shown on the map
results_potential_2nd_round_percent_df = \
    results_potential_2nd_round_percent_df[results_potential_2nd_round_percent_df.Powiat != 'statki']
results_potential_2nd_round_percent_df = \
results_potential_2nd_round_percent_df[results_potential_2nd_round_percent_df.Powiat != 'zagranica']

results_potential_2nd_round_percent_fig = px.choropleth_mapbox(
    results_potential_2nd_round_percent_df, geojson=counties, color='Other electorate [%]',
    locations='Kod TERYT', featureidkey="properties.JPT_KOD_JE",
    center={"lat": 52, "lon": 19.1451},
    opacity=0.8, color_continuous_scale=px.colors.sequential.Reds,
    hover_data={'Powiat': True, 'Kod TERYT': False},
    mapbox_style="carto-positron", zoom=5.2
)

results_potential_2nd_round_percent_fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})

results_potential_2nd_round_percent_fig.show()

The received map is somewhat similar to the map of people who voted for Rafał Trzaskowski. It is thus more likely that he will get more new voters in the second round.

Results by voivodeship

TODO tommorow, PKW has removed the data and voivodeship will not be finished until they upload the data once again.

It may be also helpful to see who has won in a larger administrative units - voivodeships. Voivodeships in Poland are based on historical regions, so it is quite common that people from the same voivodeship share similar values.

In [25]:
results_voivodeships_percent_df = pd.read_csv('data/results/results_by_voivodeship.csv', sep=';')
In [26]:
results_voivodeships_percent_df
Out[26]:
Kod TERYT Województwo Komisje obwodowe otrzymały kart do głosowania Liczba wyborców uprawnionych do głosowania Nie wykorzystano kart do głosowania Liczba wyborców, którym wydano karty do głosowania Liczba wyborców głosujących przez pełnomocnika Liczba wyborców głosujących na podstawie zaświadczenia o prawie do głosowania Liczba wyborców, którym wysłano pakiety wyborcze Liczba otrzymanych kopert zwrotnych ... Andrzej Sebastian DUDA Szymon Franciszek HOŁOWNIA Marek JAKUBIAK Władysław Marcin KOSINIAK-KAMYSZ Mirosław Mariusz PIOTROWSKI Paweł Jan TANAJNO Rafał Kazimierz TRZASKOWSKI Waldemar Włodzimierz WITKOWSKI Stanisław Józef ŻÓŁTEK Liczba obwodów
0 20000 dolnośląskie 2053530 2254674 634256 1419339 1068 15004 13092 12501 ... 545001 201050 2323 27210 1353 2356 512357 2163 3542 1947
1 40000 kujawsko-pomorskie 1451436 1580004 493946 957480 796 7831 7551 7295 ... 380190 148597 1310 24234 912 1309 322961 1082 2083 1653
2 60000 lubelskie 1530267 1679712 492682 1037595 1769 8080 10268 9915 ... 591234 108987 2095 31756 2268 1430 201571 1027 2561 1906
3 80000 lubuskie 702418 773526 230341 472088 346 4128 3396 3270 ... 161894 84590 686 9583 405 756 174894 572 913 720
4 100000 łódzkie 1756621 1931018 499238 1257463 1184 8168 11526 11049 ... 589185 163294 2143 31245 1322 1824 363209 1703 2901 1733
5 120000 małopolskie 2410795 2663068 641278 1769612 1329 18970 22592 21923 ... 912452 206034 3217 52483 1763 2116 426950 2371 5015 2419
6 140000 mazowieckie 3749140 4572339 841481 2905133 2562 31709 373340 326481 ... 1305649 408502 7104 72663 3513 4850 1099956 6128 7706 3632
7 160000 opolskie 695988 772390 262105 433877 375 2498 4282 4154 ... 176552 72609 702 10146 440 622 139125 536 919 871
8 180000 podkarpackie 1502035 1684688 445143 1056924 1259 8499 12056 11476 ... 646103 100742 1947 27287 1201 1122 172789 875 2341 1819
9 200000 podlaskie 834534 920327 283709 550864 773 5753 5013 4856 ... 280113 92088 1024 11681 602 747 114076 518 1299 964
10 220000 pomorskie 1590984 1796422 421438 1169609 661 32203 9184 8849 ... 397169 189390 1702 22400 1210 1795 453006 1671 2716 1397
11 240000 śląskie 3137863 3455664 939953 2195479 1433 13728 30247 29086 ... 913421 341169 3565 42625 2429 3535 693193 3047 5399 2753
12 260000 świętokrzyskie 908197 991408 297440 610725 1037 4153 5299 5106 ... 343752 62383 1018 19494 614 668 130670 555 1214 989
13 280000 warmińsko-mazurskie 967019 1112335 335067 631963 579 13170 3914 3788 ... 253931 93598 1062 15689 625 959 208922 755 1261 1115
14 300000 wielkopolskie 2447106 2696143 698006 1749145 1072 11901 18647 17996 ... 666539 293107 2543 44134 1698 2498 595803 3246 3932 2186
15 320000 zachodniopomorskie 1167554 1320966 358240 809304 611 30762 6414 6153 ... 287328 127257 1211 16735 710 1322 307858 1041 1617 1123

16 rows × 36 columns